#ifndef __PINMAP_H__
#define __PINMAP_H__

#include "PinNames.h"
#include <stdbool.h>

#ifdef __cplusplus
extern "C"
{
#endif

#ifndef GPIO_AF_NONE
#define GPIO_AF_NONE 0
#endif

#define NP 0U

    typedef struct
    {
        PinName pin;
        void *peripheral;
        int function;
    } PinMap;

    static inline PinName pin_pinName(const PinMap *map)
    {
        return map->pin;
    }
   
    bool pin_in_pinmap(PinName pin, const PinMap *map);
    void pin_function(PinName pin, int function);
    void pinmap_pinout(PinName pin, const PinMap *map);

    void *pinmap_find_peripheral(PinName pin, const PinMap *map);
    void *pinmap_peripheral(PinName pin, const PinMap *map);
    PinName pinmap_find_pin(void *peripheral, const PinMap *map);
    PinName pinmap_pin(void *peripheral, const PinMap *map);

    uint32_t pinmap_find_function(PinName pin, const PinMap *map);
    uint32_t pinmap_function(PinName pin, const PinMap *map);

    void *pinmap_merge_peripheral(void *a, void *b);
#ifdef __cplusplus
}
#endif

#endif // __PINMAP_H__